package view;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Observable;
import java.util.Observer;

import javax.swing.BorderFactory;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;


import model.Bericht;
import model.CiiBay;
import model.Persoon;

/**
 * Dit is de klasse die je mailbox beheert.
 * @author Nick
 * @author Yasper
 * 
 */
@SuppressWarnings("serial")
public class MailboxView extends JPanel implements Observer{

	private JPanel zijPaneel, centerPaneel;
	private JLabel inbox, verzonden, nieuwBericht, titel, allesOpenen,updaten, verwijder;
	private CiiBay ciiBay;
	private JScrollPane scroll;
	private Persoon persoon;
	private ArrayList<CheckBox> checkboxen;

	/**
	 * constructor van de MailboxView.
	 * @author Nick
	 * @author Yasper
	 * @param ciiBay
	 */
	public MailboxView(CiiBay ciiBay){
		persoon = ciiBay.getIngelogtPersoon();
		this.ciiBay = ciiBay;
		ciiBay.addObserver(this);
		checkboxen = new ArrayList<CheckBox>();
		zijPaneel = new JPanel();
		centerPaneel = new JPanel();
		inbox = new JLabel("Inbox" );
		verzonden = new JLabel("Verzonden berichten");
		nieuwBericht = new JLabel("Nieuw bericht");
		updaten = new JLabel("Updaten");
		allesOpenen = new JLabel("Markeren als geopend");
		allesOpenen.addMouseListener(new AllesOpenenListener());
		allesOpenen.setForeground(Color.BLUE);
		verwijder = new JLabel("Verwijderen");
		verwijder.addMouseListener(new VerwijderListener());
		verwijder.setForeground(Color.BLUE);

		inbox.addMouseListener(new LabelListener(inbox));
		verzonden.addMouseListener(new LabelListener(verzonden));
		nieuwBericht.addMouseListener(new LabelListener(nieuwBericht));
		updaten.addMouseListener(new LabelListener(updaten));
		maakHeelPaneel();
	}

	/**
	 * Hier wordt de layout gemaakt van het gehele paneel.
	 * @author Nick
	 * @author Yasper
	 * 
	 */
	public void maakHeelPaneel() {
		setBackground(Color.ORANGE);
		setLayout(new BorderLayout());
		titel = new JLabel("Inbox", JLabel.CENTER);
		scroll = new JScrollPane(centerPaneel,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
		titel.setPreferredSize(new Dimension(100,20));
		maakZijPaneel();
		maakBerichtenPaneel();

		add(zijPaneel, BorderLayout.WEST);
		add(titel, BorderLayout.NORTH);
		add(scroll, BorderLayout.CENTER);
		scroll.getVerticalScrollBar().setUnitIncrement(12);
		scroll.setBorder(null);

		GridBagConstraints c = new GridBagConstraints();
		c.gridy = 6;
		zijPaneel.add(allesOpenen, c);
	}

	/**
	 * Hier wordt het zijpaneel van deze view gemaakt.
	 * @author Nick
	 * @author Yasper
	 * 
	 */
	public void maakZijPaneel() {
		zijPaneel.setBackground(Color.ORANGE);
		zijPaneel.setBorder(BorderFactory.createMatteBorder(2, 2, 2, 1, Color.BLACK));
		zijPaneel.setLayout(new GridBagLayout());
		GridBagConstraints c = new GridBagConstraints();

		c.gridy = 1;
		zijPaneel.add(inbox, c);
		c.gridy = 2;
		zijPaneel.add(verzonden,c);
		c.gridy = 3;
		zijPaneel.add(nieuwBericht, c);
		c.gridy = 4;
		c.insets = new Insets(25, 0 ,0 ,0);
		zijPaneel.add(updaten, c);
		c.insets = new Insets(0, 0 ,0 ,0);
		zetLabels(inbox);
		c.gridy = 5;
		zijPaneel.add(verwijder, c);
	}

	/**
	 * Hier wordt het inbox gedeelte gemaakt.
	 * @author Nick
	 * @author Yasper
	 */
	public void maakBerichtenPaneel() {
		centerPaneel.removeAll();
		centerPaneel.setBackground(Color.ORANGE);
		centerPaneel.setBorder(BorderFactory.createMatteBorder(2, 1, 2, 2, Color.BLACK));
		centerPaneel.setLayout(new GridBagLayout());
		zetInboxBerichten();
		update(ciiBay, "Inbox");
	}

	/**
	 * Hier worden de labels van kleur veranderd als je op een label klikt in het zijpaneel.
	 * @author Nick
	 * @author Yasper
	 */
	public void zetLabels(JLabel jl) {
		inbox.setForeground(Color.BLUE);
		verzonden.setForeground(Color.BLUE);
		nieuwBericht.setForeground(Color.BLUE);
		updaten.setForeground(Color.BLUE);
		if(jl.getText().equals(updaten.getText())){
			//do nothing
		}
		else if(jl != null){
			jl.setForeground(Color.RED);
		}
	}

	/**
	 * Hier worden alle inboxberichten aangemaakt en toegevoegd.
	 * @author Nick
	 * @author Yasper
	 */
	public void zetInboxBerichten() {
		centerPaneel.removeAll();
		titel.setText("Inbox");
		int y = 1;
		GridBagConstraints c = new GridBagConstraints();
		c.gridx = 0;
		c.anchor = GridBagConstraints.NORTHWEST;
		c.insets = new Insets(0,0,5,0);
		c.fill = GridBagConstraints.BOTH;
		for(Bericht b: persoon.getMailbox().getInbox()){
			CheckBox check = new CheckBox(b);
			check.setBackground(Color.ORANGE);
			checkboxen.add(check);
			c.gridx = 0;
			centerPaneel.add(check, c);
			c.gridx = 1;
			centerPaneel.add(new EnkelBerichtResultaat(b, ciiBay), c);
			y++;
		}
		centerPaneel.repaint();
		revalidate();
	}

	/**
	 * Hier worden alle uitboxberichten aangemaakt en toegevoegd.
	 * @author Nick
	 * @author Yasper
	 */
	public void zetVerzondenBerichten() {
		centerPaneel.removeAll();
		titel.setText("Verzonden berichten");
		int y = 1;
		GridBagConstraints c = new GridBagConstraints();
		c.gridx = 0;
		c.anchor = GridBagConstraints.NORTHWEST;
		c.fill = GridBagConstraints.BOTH;
		c.insets = new Insets(0,0,5,0);
		for(Bericht b: persoon.getMailbox().getverzonden()){
			CheckBox check = new CheckBox(b);
			check.setBackground(Color.ORANGE);
			checkboxen.add(check);
			c.gridx = 0;
			centerPaneel.add(check, c);
			c.gridx = 1;
			centerPaneel.add(new EnkelBerichtResultaat(b, ciiBay), c);
			y++;
		}
		centerPaneel.repaint();
		revalidate();
	}

	/**
	 * Hier kan een nieuw bericht aangemaakt worden.
	 * @author Nick
	 * @author Yasper
	 */
	public void zetNieuwBericht(int i) {
		titel.setText("Nieuw bericht");
		centerPaneel.removeAll();
		centerPaneel.add(new BerichtMaakView(ciiBay.getPersoon(3), ciiBay, i));
		centerPaneel.repaint();
		revalidate();
	}

	/**
	 * Listener voor de zijpaneel labels.
	 * @author Nick
	 * @author Yasper
	 */
	class LabelListener extends MouseAdapter {
		
		private JLabel label;

		public LabelListener(JLabel label) {
			this.label = label;
		}
		@Override
		public void mouseClicked(MouseEvent arg0) {
			ciiBay.inlezen();
			persoon.getMailbox().addBerichten(ciiBay);
			zetLabels(label);
			zijPaneel.remove(allesOpenen);
			checkboxen.clear();
			if(label.getText().equals(inbox.getText())){
				GridBagConstraints c = new GridBagConstraints();
				c.gridy = 6;
				zijPaneel.add(allesOpenen, c);
				zijPaneel.repaint();
				zetInboxBerichten();
			} else if(label.getText().equals(verzonden.getText())){
				zetVerzondenBerichten();
			} else if(label.getText().equals(nieuwBericht.getText())){
				zetNieuwBericht(0);
			}
			else if(label.getText().equals(updaten.getText())){
				GridBagConstraints c = new GridBagConstraints();
				c.gridy = 100;
				c.ipady = 50;
				zijPaneel.add(allesOpenen, c);
				zijPaneel.repaint();
				zetInboxBerichten();
				zetLabels(inbox);
			}
		}	
	}

	@Override
	public void update(Observable arg0, Object arg1) {
		persoon.getMailbox().addBerichten(ciiBay);
		String message = (String) arg1;
		if(message.equals("Inbox")) {
			centerPaneel.removeAll();
			this.zetInboxBerichten();
		} else if (message.equals("Verzonden berichten")){
			centerPaneel.removeAll();
			this.zetVerzondenBerichten();
		} else if (message.contains("nieuwBericht")) {
			String[] temp = message.split(",");
			centerPaneel.removeAll();
			int i = 0;
			if(temp[1] != null){
				i = Integer.parseInt(temp[1]);
			}
			this.zetNieuwBericht(i);
		}
	}

	/**
	 * Checkbox om berichten te kunnen selecteren.
	 * @author Nick
	 * @author Yasper
	 */
	class CheckBox extends JCheckBox {
		private Bericht bericht;

		public CheckBox(Bericht bericht) {
			this.bericht = bericht;
		}

		public Bericht getBericht(){
			return bericht;
		}
	}

	/**
	 * Listener om alle geselecteerde berichten te kunnen openen.
	 * @author Nick
	 * @author Yasper
	 */
	class AllesOpenenListener extends MouseAdapter {

		@Override
		public void mouseClicked(MouseEvent arg0) {
			for( CheckBox c: checkboxen) {
				if(c.getBericht().getOntvanger().getID() == ciiBay.getIngelogtPersoon().getID() && c.isSelected()){
					ciiBay.berichtNietNieuw(c.getBericht());
				}
			}
			centerPaneel.removeAll();
			zetInboxBerichten();
		}
	}

	/**
	 * Listener om alle geselecteerde berichten te kunnen verwijderen.
	 * @author Nick
	 * @author Yasper
	 */
	class VerwijderListener extends MouseAdapter {

		@Override
		public void mouseClicked(MouseEvent arg0) {
			if(JOptionPane.showConfirmDialog( null, "Weet u zeker dat u alle geselecteerde berichten wilt verwijderen?", "Verwijderen", JOptionPane.YES_NO_OPTION)== JOptionPane.YES_OPTION){
				for( CheckBox c: checkboxen) {
					if(titel.getText().equals("Inbox") && c.isSelected()) {
						ciiBay.zetBerichtVerwijderd(c.getBericht(), "ontvanger" );
					} else if(titel.getText().equals("Verzonden berichten") && c.isSelected()) {
						ciiBay.zetBerichtVerwijderd(c.getBericht(), "verzender" );
					}
				}
			}
			ciiBay.inlezen();
			centerPaneel.removeAll();
			update(ciiBay, titel.getText());
		}
	}
}